/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

package org.apache.commons.exec.launcher;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.environment.EnvironmentUtils;

/**
 * A command launcher for JDK/JRE 1.3 (and higher). Uses the built-in
 * Runtime.exec() command
 *
 */
public class Java13CommandLauncher extends CommandLauncherImpl {
	private boolean redirectErrorStream=false;
	/**
	 * Constructor
	 */
	public Java13CommandLauncher() {
		this(false);
	}
	
	public Java13CommandLauncher(boolean redirectErrorStream) {
		super();
		this.redirectErrorStream = redirectErrorStream;
	}

	/**
	 * Launches the given command in a new process, in the given working directory
	 *
	 * @param cmd
	 *            the command line to execute as an array of strings
	 * @param env
	 *            the environment to set as an array of strings
	 * @param workingDir
	 *            the working directory where the command should run
	 * @throws IOException
	 *             probably forwarded from Runtime#exec
	 */
	@Override
	public Process exec(final CommandLine cmd, final Map<String, String> env, final File workingDir) throws IOException {

		//final String[] envVars = EnvironmentUtils.toStrings(env);

		//return Runtime.getRuntime().exec(cmd.toStrings(), envVars, workingDir);
		
		ProcessBuilder pb = new ProcessBuilder(cmd.toStrings()).directory(workingDir).redirectErrorStream(redirectErrorStream);
		Map<String, String> environment = pb.environment();
		
		if(env!=null){
			final String[] envVars = EnvironmentUtils.toStrings(env);
			for (String envstring : envVars) {
				// Before 1.5, we blindly passed invalid envstrings
				// to the child process.
				// We would like to throw an exception, but do not,
				// for compatibility with old broken code.

				// Silently discard any trailing junk.
				if (envstring.indexOf((int) '\u0000') != -1)
					envstring = envstring.replaceFirst("\u0000.*", "");

				int eqlsign = envstring.indexOf('=', 1/*ProcessEnvironment.MIN_NAME_LENGTH*/);
				// Silently ignore envstrings lacking the required `='.
				if (eqlsign != -1)
					environment.put(envstring.substring(0, eqlsign), envstring.substring(eqlsign + 1));
			}
		}
		return pb.start();
	}
}
